package cn.huanghuai.reggie.common;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 元数据对象处理器：为自动填充公共字段实现的类。
 *  加入@Component注解，让springboot识别到
 *  实现 MetaObjectHandler，以及方法
 */

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 获取session中的数据方法
     *      通过ThreadLocal来获取session中的数据。
     *      ThreadLocal为每一次线程提供了单独一份存储空间，具有线程隔离的效果，，只有线程内才能获取对应的值，线程外则不能访问。
     * ThreadLocal常用方法
     *      public void set(T value) 设置当前线程的线程局部变量的值
     *      public T get()           返回当前线程所对应的线程局部变量的值
     *
     *  步骤：1.编写BaseContext工具类，基于ThreadLocal封装的工具类
     *       2.先在过滤器中或者controller层将对应数据放入ThreadLocal中
     *       3.在自动字段赋值方法中通过ThreadLocal拿到
     * @param metaObject
     */

    //插入时执行
    @Override
    public void insertFill(MetaObject metaObject) {
        //这里会拦截到insert操作以及数据，在这里给字段赋值。 字段名， 赋值
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());

        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }

    //更新时执行
    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
}
